package Reflect.demo01;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
    通过字节码对象操作方法
 */
public class ReflectDemo03 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Book book=new Book(1,"dnf");
        Class<?> aClass=Class.forName("Reflect.Book");

        //通过字节码对象得到public修饰的方法对象
        Method method1=aClass.getMethod("read");
        //调用指定对象的该方法,返回值为Object,当底层的方法返回值为void是，该方法返回null
        method1.invoke(book);

        //通过字节码对象得到任意修饰符修饰的方法对象
        Method method2=aClass.getDeclaredMethod("write");
        //设置该方法对象在访问该方法时跳过访问修饰符的检查
        method2.setAccessible(true);
        method2.invoke(book);

        //得到public修饰的所有方法对象，包括继承和接口的所有方法
        Method methods1[]=aClass.getMethods();
        for(Method method:methods1){
            System.out.println(method);
        }
        System.out.println("-------------------------");
        //得到任意修饰符修饰的所有方法对象,不包括继承方法，包括接口方法
        Method methods2[]=aClass.getDeclaredMethods();
        for(Method method:methods2){
            System.out.println(method);
        }

    }
}
